<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>闭包</title>
</head>

<body>
    <button onclick="add()">增加一条命</button>
    <button onclick="sub()">减少加一条命</button>
    <script>
        /**
                                                                                                                                                                                                                                                一、闭包概念
                                                                                                                                                                                                                                                一般理解为闭包就是能够读取其他函数内部变量的函数
                                                                                                                                                                                                                                                */
        // 可以访问其他函数作用域内的变量的函数,就是闭包
        // 使用场景:1、隐藏变量(封装私有变量),不想让别人轻易修改
        function fun1() {
            var n = 999

            function f2() {
                console.log(n)
            }

            return f2
        }

        // console.log(n);//直接访问，报错，读取不到函数内变量

        fun1()() //999 通过闭包可以访问到函数内部变量{}


        function changeLive() {
            let count = 1

            function addLive() {
                count++
                console.log(count);
            }

            function subscribeLive() {
                count--
                console.log(count);
            }

            return {
                addLive: addLive,
                subscribe: subscribeLive
            }
        }

        let addnumber = changeLive().addLive
        let subnumber = changeLive().subscribe

        function add() {
            addnumber()
        }

        function sub() {
            subnumber()
        }

        // 使用场景2 给settimeout穿参数
        function ff(a) {
            return function fff() {
                console.log(a)
            }
        }

        var funn = ff(1)
        setTimeout(() => {
            funn()
        }, 1000);


        let a = 88
        setTimeout((a) => {
            console.log('定时器', a)
        }, 1000);

        //3、 用在函数防抖上
        // 4、回调函数,定义行为,然后把它关联到某个用户时间上


        // 闭包缺点:闭包多了,会大量占用内存,在ie上
        // 还可能造成内存泄漏
    </script>

    <div>
        <!-- 参考连接 -->
        <!-- https://www.cnblogs.com/gg-qq/p/11399152.html -->

    </div>
</body>

</html>